package recPadroes;

import java.io.File;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Scanner;

public class Classificador {
	private double taxErr;
	private Padrao padrao[] = new Padrao[150];
	
	public Classificador(){
		for(int i=0;i<150;i++){
			padrao[i] = new Padrao();
		}
	}
	public double getTaxErr() {
		return this.taxErr;
	}

	public String classificarKNN(int k, Padrao teste[], Padrao treino[]){
		
		return "";
	}
	
	public Padrao[] getPadrao(){
		return this.padrao;
	}
	
	public double maiorMenorA(Padrao a[]){
		double dif=0, maior=0, menor=a.length, aux;
		for(int i=0;i<a.length;i++){
			aux = a[i].getA();
			if(aux>maior){
				maior=aux;
			}
		}
		for(int j=0;j<a.length;j++){
			aux = a[j].getA();
			if(aux<menor){
				menor=aux;
			}
		}
		dif=maior-menor;
		return dif;
	}
	
	public double maiorMenorB(Padrao b[]){
		double dif=0, maior=0, menor=b.length, aux;
		for(int i=0;i<b.length;i++){
			aux = b[i].getB();
			if(aux>maior){
				maior=aux;
			}
		}
		for(int j=0;j<b.length;j++){
			aux = b[j].getB();
			if(aux<menor){
				menor=aux;
			}
		}
		dif=maior-menor;
		return dif;
	}
	
	public double maiorMenorC(Padrao c[]){
		double dif=0, maior=0, menor=c.length, aux;
		for(int i=0;i<c.length;i++){
			aux = c[i].getC();
			if(aux>maior){
				maior=aux;
			}
		}
		for(int j=0;j<c.length;j++){
			aux = c[j].getC();
			if(aux<menor){
				menor=aux;
			}
		}
		dif=maior-menor;
		return dif;
	}
	
	public double maiorMenorD(Padrao d[]){
		double dif=0, maior=0, menor=d.length, aux;
		for(int i=0;i<d.length;i++){
			aux = d[i].getD();
			if(aux>maior){
				maior=aux;
			}
		}
		for(int j=0;j<d.length;j++){
			aux = d[j].getD();
			if(aux<menor){
				menor=aux;
			}
		}
		dif=maior-menor;
		return dif;
	}
	
//	public double mediaA(Padrao p[]){
//		
//	}
	
	public double distanciaEuclidiana(Padrao p,Padrao d,Padrao pasta[]){
		double dist=0,aux;
		aux=Math.pow(((p.getA()-d.getA())/this.maiorMenorA(pasta)), 2);
		dist+=aux;
		aux=Math.pow(((p.getB()-d.getB())/this.maiorMenorB(pasta)), 2);
		dist+=aux;
		aux=Math.pow(((p.getC()-d.getC())/this.maiorMenorC(pasta)), 2);
		dist+=aux;
		aux=Math.pow(((p.getD()-d.getD())/this.maiorMenorD(pasta)), 2);
		dist+=aux;
		dist=Math.sqrt(dist);
		return dist;
	}
	
	public Padrao[][] foldCrossValidation(Padrao p[]){
		Padrao pasta[][] = new Padrao[10][15];
		for(int i=0,n=0;i<10;i++,n+=5){
			for(int j=0;j<15;j++){
				pasta[i][j] = new Padrao();
				if(j < 5){
					pasta[i][j] = p[j+n];
				}
				if((j >= 5) && (j < 10)){
					pasta[i][j] = p[j+n+45];
				}
				if(j >= 10){
					pasta[i][j] = p[j+n+90];
				}
			}
		}
		return pasta;
	}
	
	public void lerArquivo(){
		int i=0;
		try {  
            Scanner scanner = new Scanner(new File("iris.txt"));  
            while ( scanner.hasNext() ) {
                try {
                	padrao[i]= new Padrao();
                	padrao[i].setA(Double.parseDouble(scanner.next()));
                	padrao[i].setB(Double.parseDouble(scanner.next())); 
                	padrao[i].setC(Double.parseDouble(scanner.next()));
                	padrao[i].setD(Double.parseDouble(scanner.next()));
                	padrao[i].setClasse(scanner.next());  // nextLine() para String  
//                	System.out.println(padrao[i].getA() + " " + padrao[i].getB() + " " + padrao[i].getC() + " " + padrao[i].getD() + " " + padrao[i].getClasse());
                	i++;
                } //fim do try
                catch (NoSuchElementException nex) {  
                    String line = scanner.nextLine();  
                    System.err.println("Error in line: " + line);  
                }  	
            }//fim while  
            scanner.close(); 
        } 
        catch (IOException ex) {  
            ex.printStackTrace();  
       }//fim do catch
	} //fim do ler arquivo
}